package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author zhangbaiyan
 * @date 2024-10-02 14:48
 * @description:
 * @version:
 */
@Order(1)  //数字越小,越线执行 优先级高  ,
@Slf4j
@Component
@Aspect
public class MyAspect1 { //名字字母排序越前越先执行
    /*
    execution(访问权限符? 返回值类型 包名.类名.?方法名(参数列表) throws 异常?) ?问好表示?前内容可省略
     execution(* com.itheima.service.impl.DeptServiceImpl.*(..))
     *:单个独立的任意符号,可以任意返回值、包名、
     *:单个独立的任意符号,可以任意返回值、包名、
     *:单个独立的任意符号,可以任意返回值、包名、类名任意类型的一个参数,也可以通配包、类方法名的一部分
        execution(* com.*.service.*.update*(*))
     ..:多个连续的任意符号,可以任意返回值、包名、类名、方法名、参数列表
        execution(* com.itheima..DeptService.*(..))

        更具业务需要,可以使 且(&&)、或(&)、非(!),并且(&&),或者(||)、非(!),在切入点表达式中,可用来组合多个切面
     */

    //切入点表达式
//    @Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    @Pointcut("@annotation(com.itheima.aop.MyLog)")
    public void pointCut(){}



    //原始方法执行前
    @Before("pointCut()")//("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void before(){
        log.info("before...");
    }
    //环绕原始方法执行
    @Around("pointCut()")//("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        //调用目标对象的原始方法执行
        log.info("around...");
        Object result = joinPoint.proceed();

        log.info("around...");
        return result;
    }
    //原始方法执行后
    @After("pointCut()")//("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public  void after(){
        log.info("after...");
    }
    //原始方法正常执行后
    @AfterReturning("pointCut()")//("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void afterReturning(){
        log.info("afterReturning...");
    }
    //原始方法抛出异常后
    @AfterThrowing("pointCut()")//("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void afterThrowing(){
        log.info("afterThrowing...");
    }
}
